#include <assert.h>
#include "spipe.h"
#include <stdlib.h>
#include "scommand.h"
struct s_pipeline_t
{
  scommand_t *sc;
  bool wait;
  int size;
  int pos;
};

/*crea una estructura spipe
retorna NULL si no es posible crear la estructura pipe line*/

pipeline_t pipeline_create(void)
{
	pipeline_t pipe;
	pipe=NULL;
	
	pipe=malloc(sizeof(struct s_pipeline_t));
	
	if (pipe!=NULL)
	{
		pipe->sc=NULL;
		pipe->wait=FALSE;
		pipe->size=0;
		pipe->pos=0;
	
	}
	return pipe;

}

/*destruye la estructura pipeline, ps tiene que ser !=NULL*/
void pipeline_destroy(pipeline_t ps)
{
	int i=0;
	
	assert(ps!=NULL);
	
	for (i=0;i<ps->size;i++)
	{
		scommand_destroy((ps->sc)[i]);
	}
	
	free(ps->sc);
	ps->sc=NULL;
	
	free(ps);
	ps=NULL;
	
	
}
/*inserta por atras una structura scommand a la estructuura spipeline
sc y ps tiene que ser !=NULL.
*/
void pipeline_push_back(pipeline_t ps, const scommand_t sc)
{
	scommand_t comm=NULL;
	
	assert(sc!=NULL && ps!=NULL);
		
	comm=scommand_clone(sc);
		
	ps->sc=realloc(ps->sc,sizeof(scommand_t)*((ps->size)+1));
	
	if (ps->sc!=NULL)
	{
		ps->sc[ps->size]=comm;
		ps->size+=1;
		comm=NULL;
	}
  
}

/*retorna una estructura scommand
solo debe llamarse si hay estrcturas que retornar,
esto es si pipeline_is_empty==FALSE.
en caso de error retorna NULL
*/
scommand_t pipeline_get_front(pipeline_t ps)
{
  	scommand_t sc=NULL;
  	if (ps==NULL)
	{
		return NULL;
	}
	sc=scommand_clone((ps->sc)[ps->pos]);
	ps->pos+=1;
	return sc;  
  
}

/*retorna un boleano cuyo valor indica si la estructura esta vacia. */
bool pipeline_is_empty(const pipeline_t ps)
{
	assert(ps!=NULL);
	return((ps->pos)==(ps->size));
}

/*setea un valor boleano que indica si existe el amperson*/
void pipeline_set_wait(pipeline_t ps, const bool w)
{
	assert(ps!=NULL);
	ps->wait=w;
}

/*retorna un boleano cuyo valor indica si existe un amperson en la estructura*/
bool pipeline_get_wait(const pipeline_t ps)
{
	assert(ps!=NULL);
	return ps->wait;
}
